package com.activiti.ActivitiUtils.runtime;

import com.activiti.ActivitiUtils.bean.Page;
import com.activiti.ActivitiUtils.bean.WrappedTaskBean;
import com.activiti.ActivitiUtils.builder.payload.task.TaskCompletePayload;
import com.activiti.ActivitiUtils.builder.payload.task.TaskQueryPayload;
import com.activiti.ActivitiUtils.builder.payload.task.TaskVariablePayload;

import java.util.List;
import java.util.Map;

/**
 * create by chongyahhh
 * 2020/4/4
 */
public interface WrappedTaskRuntime {
    /**
     * 直接根据id获取任务，不经过用户信息校验
     * @param taskId : 任务id
     * @return
     */
    WrappedTaskBean getTask(String taskId);

    /**
     * 根据条件获取任务列表
     * 要经过用户信息检验,要是参数中用户和组都是null的话，就按照登录信息查
     * 要是有其中一个的话，就按照需求查
     * 不用的条件留空就行
     * @param taskPayload
     * @return
     */
    List<WrappedTaskBean> getTaskList(TaskQueryPayload taskPayload);

    /**
     * 分页
     * 查询条件同上
     * @param taskPayload
     * @return
     */
    Page<List<WrappedTaskBean>> getTaskWithPage(TaskQueryPayload taskPayload, Integer pageNum, Integer pageSize);

    /**
     * 绑定负责人
     * 绑定当前用户到taskId对应的任务上
     * @return
     */
    WrappedTaskBean claim(String taskId);

    /**
     * 绑定assigneeId到taskId对应的任务上
     * @param taskId
     * @param assigneeId
     * @return
     */
    WrappedTaskBean claim(String taskId,String assigneeId);

    /**
     * 解绑
     * @return
     */
    WrappedTaskBean release(String taskId);

    /**
     * 解绑(会判断当前用户)
     * @return
     */
    WrappedTaskBean release(String taskId,String assigneeId);

    /**
     * 完成任务
     * 注意，当前用户必须是该任务的执行人才能执行
     * @param taskPayload ： 只需要id，assigneeId可写可不写
     * @return
     */
    WrappedTaskBean complete(TaskCompletePayload taskPayload);

    /**
     * 无视执行人，强制执行
     * @param taskPayload
     * @param compel ：是否强制执行
     * @return
     */
    WrappedTaskBean complete(TaskCompletePayload taskPayload, boolean compel);

    /**
     * 获取流程变量和任务变量
     * key:
     * local -> 任务变量
     * global -> 流程变量
     * @param taskId
     * @return
     */
    Map<String,Map<String,Object>> getVariables(String taskId);

    /**
     * 绑定变量
     * @param taskPayload ：要id，两个变量要绑什么就放什么
     */
    void setVariables(TaskVariablePayload taskPayload);

    /**
     * 移除流程变量
     * @param taskId ： 任务id
     * @param variableNames ： 变量key值
     */
    void removeVariables(String taskId,List<String> variableNames);

}
